package com.spring.boot.utils;

import org.springframework.data.redis.core.RedisTemplate;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class RedisUtil<T> {

    private final RedisTemplate<String, T> redisTemplate;

    public RedisUtil(RedisTemplate<String, T> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 指定缓存失效时间
     *
     * @param key      redis key
     * @param time     过期时间
     * @param timeUnit 时间单位
     * @return 是否成功
     */
    public boolean expire(String key, long time, TimeUnit timeUnit) {
        return Boolean.TRUE.equals(redisTemplate.expire(key, time, timeUnit));
    }

    /**
     * 获取过期时间
     *
     * @param key      redis key
     * @param timeUnit 时间单位
     * @return 过期时间
     */
    public long getExpire(String key, TimeUnit timeUnit) {
        Long expire = redisTemplate.getExpire(key, timeUnit);
        return expire != null ? expire : 0;
    }

    /**
     * 判断缓存中是否有指定key
     *
     * @param key redis key
     * @return 是否有指定key
     */
    public boolean hasKey(String key) {
        return Boolean.TRUE.equals(redisTemplate.hasKey(key));
    }

    /**
     * 删除指定key
     *
     * @param key redis key
     * @return 是否删除成功
     */
    public boolean delete(String key) {
        return Boolean.TRUE.equals(redisTemplate.delete(key));
    }

    /**
     * 删除指定的键值对
     *
     * @param keys 要删除的键值对列表
     * @return 被删除的键值对数量，若删除失败则返回0
     */
    public long delete(List<String> keys) {
        Long result = redisTemplate.delete(keys);
        return result != null ? result : 0L;
    }

    /**
     * 根据key获取缓存的值
     *
     * @param key redis key
     * @return 缓存的值
     */
    public T get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 设置缓存
     *
     * @param key      redis key
     * @param value    缓存的值
     * @param time     过期时间
     * @param timeUnit 时间单位
     */
    public void set(String key, T value, long time, TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, value, time, timeUnit);
    }

    public void increment(){
        redisTemplate.opsForValue().increment("count");
    }
}